#include<iostream>
#include<cstring>
using namespace std;
struct Stu
{
    char name[20];
	int age;	
};

int cmp_Stu_by_name(const void*e1,const void*e2)
{
	//strcmp --> >0 ==0 <0
	return strcmp(((Stu*)e1)->name,((Stu*)e2)->name);
}

int cmp_Stu_by_age(const void*e1,const void*e2)
{
	return (((Stu*)e1)->age-((Stu*)e2)->age);
}

int cmp_int(const void*e1,const void*e2)
{
	return (*(int *)e1 - *(int *)e2);
}

void Swap(char* buf1,char* buf2,int width)  
{
	for(int i = 0;i < width;++i)
	{
	char temp = *buf1;
	*buf1 = *buf2;
	*buf2 = temp;
	*buf1++;
	*buf2++;
	}
}

void bubble_sort(void* arr,int sz,int width,int (*cmp)(const void*e1,const void*e2))
{
	for(int i = 0;i < sz-1;++i)
	{
		int flag = 1;
		//该处为了检验该数组中元素是否还需要排序。
		for(int j = 0;j < sz-1-i;++j)
		{
			if(cmp((char*)arr+j*width,(char*)arr+(j+1)*width) > 0)
			{
			Swap((char*)arr+j*width,(char*)arr+(j+1)*width,width);
			flag = 0;
			}
		}
		if(flag == 1)
		{
			break;
		}
	}
}

void test1()
{
	int arr[10] = {9,8,7,6,5,4,3,2,1,0};
	int sz = sizeof(arr)/sizeof(arr[0]);
	bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
	for(int i = 0;i < sz;++i)
	{
		cout<<arr[i]<<" ";
	}
}

void test2()
{
	Stu s[] = {{"zhangsan",20},{"lisi",10},{"wangwu",30}};
	int sz = sizeof(s)/sizeof(s[0]);
	bubble_sort(s,sz,sizeof(s[0]),cmp_Stu_by_name);
	for(int i = 0;i < sz;++i)
	{
		cout<<s[i].name<<"----"<<s[i].age<<" ";
	}
}

//void test3()
//{
//	Stu s[] = {{"zhangsan",20},{"lisi",10},{"wangwu",30}};
//	int sz = sizeof(s)/sizeof(s[0]);
//	bubble_sort(s,sz1,sizeof(s[0]),cmp_Stu_by_age);
//	for(int i = 0;i < sz;++i)
//	{
//		cout<<s[i].name<<"----"<<s[i].age<<" ";
//	}
//}

int main()
{	
    test1();
    cout<<endl;
    cout<<"----------------"<<endl;
    test2();
    //cout<<endl;
    //cout<<"----------------"<<endl;
    //test3();
	return 0;
 } 
 
 /*void qsort(void* base,  //你要排序的数据的起始位置 
            size_t num,    //待排序的数据元素的个数 
			size_t width,  //待排序的数据元素的大小 
			int (*cmp)(const void* e1,const void* e2))//函数指针-比较函数
	//该函数可以排序任意类型的数据，内部采用快速排列的方法进行排列。
	//需要引头文件<stdlib.h> 
	//使用方法与其上类似进行排列时可以使用。